#!/usr/bin/env php
<?php

const HELP_INFO = <<<HELP
-y : 默认情况下如果 nginx 目录下存在着站点的配置文件，则不会自动生成

php admin quick : 快速开始，只生成最基本的配置文件

php admin local   
    -init       : 初始化本地环境；如果已经存在，则会自动备份到 backup/local_xxx 目录下
        -port=Num   : nginx 反代的端口号；默认值为 -port=8071
        -y          : 覆盖已存在的文件
    -backup     : 备份当前项目的配置文件到 backup/local_xxx 目录下
    -clear      : 删除由 `php admin local -init` 生成的文件，必须添加 -y，否则只是预览删除文件；删除前会自动备份到 sync/local_xxx 目录下

php admin sync
    -dir[=Str]   : 操作的目录，默认为 default；
    -c           : 将配置文件生成到指定目录下，并同时生成一份 ssh.php 文件
        -y           : 强制覆盖已经存在的配置文件（ssh.php 不会被覆盖）
    -ping        : 检测 ssh.php 是否可以与远程环境通信
    -u[=Str]     : 将 -dir 目录下的配置文件上传到 ssh.php 中服务器指定的项目位置；
                   默认值为 *，表示同时上传 app, nginx, hosts
                   app   上传应用相关的配置文件
                   nginx 上传 nginx 配置文件及证书
                   hosts 修改 /etc/hosts 文件
    -urm[=Str]   : 移除 -u 所上传的文件，默认值为 *，可选值为 app|nginx|hosts
    -d           : 下载远程项目的配置文件到指定的本地目录，保存时到自动追加日期
    -log         : 下载远程项目日志文件到指定目录下，保存时自动追加日期
    -proj[=Str]    : 推送指定  project 到远程目录，同时在 ssh.php 中记录 推送的时间；如果不指定名称，则从配置文件中读取
                   : 示例: php admin sync -dir=x1 -proj=y1,y2
        -git     : 同时在项目下执行 git pull 更新项目

php admin artisan xxx : 往 php 所在服务发送命令，与进入服务内容执行 php artisan xxx 效果相同
                      : 示例: php admin artisan p/demo/main
    -s=[Str]     : 可选，指定服务名称，否则将从 docker-compose.yaml 中读取

php admin nginx ws : 开启/关闭 docker/nginx/sites/nginx 配置文件中的 workerman 配置    
HELP;
include_once __DIR__ . '/toolkit/__init__.php';

array_shift($argv);
$g = new G($argv);
switch ($g->action) {
    case 'artisan': // 向 docker php 服务内部发送命令
        // 使用示例：
        // php .\admin artisan p/demo/main/test
        // php .\admin artisan p/demo/main/say 16
        $dService = new DockerService($g);
        $dService->artisan();
        break;
    case 'nginx': // 向 docker nginx 服务内部发送命令
        $dService = new DockerService($g);
        $dService->nginx();
        break;
    case 'test':
        system('php src/vendor/bin/phpunit');
        break;
    case 'quick':
        $local = new LocalProject($g); // 生成基本配置文件
        $local->runQuickStart();
        break;
    case 'local':
        $local = new LocalProject($g);
        if ($g->hasArgsWithKey('init')) {// 初始化本地环境
            $local->runInit();
        } elseif ($g->hasArgsWithKey('backup')) { // 备份当前的配置文件
            $local->runBackup();
        } elseif ($g->hasArgsWithKey('clear')) { // 清除由 local init 生成的配置文件
            $local->runClear($g->hasArgsWithKey('y'));
        }
        break;
    case 'sync':
        $sync = new SyncProject($g);
        if ($g->hasArgsWithKey('c')) { // 将配置文件生成到指定目录下
            $sync->runCreate();
        } elseif ($g->hasArgsWithKey('ping')) { // 检测 ssh.php 配置是否正确
            $sync->runPing();
        } elseif ($g->hasArgsWithKey('u')) { // 将指定目录下的配置文件上传到远程
            $sync->runUpload($g->getArgsWithKey('u', '*'));
        } elseif ($g->hasArgsWithKey('urm')) { // 从远程删除
            $sync->runRemoteRm($g->getArgsWithKey('urm', '*'));
        } elseif ($g->hasArgsWithKey('d')) { // 下载远程项目的配置文件到本地
            $sync->downloadRemote();
        } elseif ($g->hasArgsWithKey('log')) { // 下载远程项目的日志文件到本地
            $sync->downloadLogs();
        } elseif ($g->hasArgsWithKey('proj')) { // exam: php admin sync -dir=boyu -proj=house
            $sync->pushProjects($g->getArgsWithKey('proj'));
        }
        break;
    default:
        echo "~~~~~~~~~~ HOW TO USE ~~~~~~~~~~", PHP_EOL;
        echo HELP_INFO, PHP_EOL;
        return;
}
if (!empty($g->messages)) {
    echo PHP_EOL;
    print_r($g->messages);
}
echo PHP_EOL;
$g->saveMaintainTmp();